// 6.整数拆分
// https://leetcode.cn/problems/integer-break/
// 给定一个正整数 n，将其拆分为至少两个正整数的和，
// 并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
// 输入: 2
// 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。
// 输入: 10
// 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
// 假设 n 不小于 2 且不大于 58。
//解
// 思路：dp[i]为正整数i拆分之后的最大乘积，循环数字n，
// 对每个数字进行拆分，取最大的乘积，状态转移方程：
// dp[i] = Math.max(dp[i], dp[i-j]*j, (i-j)*j)，
// j*(i-j)表示把i拆分为j和i-j两个数相乘，
// j*dp[i-j]表示把i拆分成j和继续把(i-j)这个数拆分，
// 取(i-j)拆分结果中的最大乘积与j相乘
// 时间复杂度O(n^2)，两层循环。空间复杂度O(n)，
// dp数组的空间

// dp[n] = max{i*dp[n-i], i*(n-i), i=1,2,3...n-1 }

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n+1);
        dp[1] = 1;
        dp[2] = 1;
        for (int i = 3; i <= n; i++) {
            for (int j = 1; j < i; j++) {
                dp[i] = max(dp[i], j*dp[i-j]);
                dp[i] = max(dp[i], j*(i-j));
            }
        }
        return dp[n];
    }
};

int main() {
    Solution sol;
    int n = 0;
    while(cin >> n) {
        int res = sol.integerBreak(n);
        printf("%d\n", res);

    }
    return 0;
}
